//package com.wonders.app.utils;
//
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.jcraft.jsch.*;
//import com.wonders.app.bean.NodeBean;
//import com.wonders.app.bean.SFTP;
//import com.wonders.common.exception.RRException;
//import com.wonders.common.utils.R;
//import org.springframework.stereotype.Repository;
//import org.springframework.web.multipart.MultipartFile;
//
//import javax.servlet.http.HttpServletResponse;
//import java.io.*;
//import java.net.URLEncoder;
//import java.util.*;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//import java.util.regex.PatternSyntaxException;
//
//@Repository
//public class FTPUtils {
//    /**
//     * 连接ftp/sftp服务器
//     * todo 用户名密码读取操作，在文件中配置
//     */
//    public static void getConnect(SFTP s)  {
//
//        /** 密钥的密码  */
////      String privateKey ="key";
////        /** 密钥文件路径  */
////      String passphrase ="path";
//        /** 主机 */
//        String host = "101.200.42.125";
//        /** 端口 */
//        int port = 22;
//        /** 用户名 */
//        String username = "root";
//        /** 密码 */
//        String password = "Song123456";
//        Session session = null;
//        Channel channel = null;
//        ChannelSftp sftp = null;// sftp操作类
//        JSch jsch = new JSch();
//
//        //设置密钥和密码
//        //支持密钥的方式登陆，只需在jsch.getSession之前设置一下密钥的相关信息就可以了
////      if (privateKey != null && !"".equals(privateKey)) {
////             if (passphrase != null && "".equals(passphrase)) {
////              //设置带口令的密钥
////                 jsch.addIdentity(privateKey, passphrase);
////             } else {
////              //设置不带口令的密钥
////                 jsch.addIdentity(privateKey);
////             }
////      }
//        try {
//            session = jsch.getSession(username, host, port);
//        } catch (JSchException e) {
//            throw new RRException("连接服务器异常");
//        }
//        session.setPassword(password);
//        Properties config = new Properties();
//        config.put("StrictHostKeyChecking", "no"); // 不验证 HostKey
//        session.setConfig(config);  // 为Session对象设置properties
//        try {
//            session.connect(); // 通过Session建立链接
//        } catch (Exception e) {
//            if (session.isConnected())
//                session.disconnect();
//            System.out.println("连接服务器失败,请检查主机[" + host + "],端口[" + port
//                    + "],用户名[" + username + "],端口[" + port
//                    + "]是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.");
//        }
//        try {
//            channel = session.openChannel("sftp"); // 打开SFTP通道
//            channel.connect();  // 建立SFTP通道的连接
//        } catch (Exception e) {
//            if (channel.isConnected())
//                channel.disconnect();
//            System.out.println("连接服务器失败,请检查主机[" + host + "],端口[" + port
//                    + "],用户名[" + username + "],密码是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.");
//        }
//        sftp = (ChannelSftp) channel;
//        s.setChannel(channel);
//        s.setSession(session);
//        s.setSftp(sftp);
//    }
//
//    /**
//     * 断开连接
//     */
//    public static void disConn(Session session, Channel channel, ChannelSftp sftp) {
//        if (null != sftp) {
//            sftp.disconnect();
//            sftp.exit();
//            sftp = null;
//        }
//        if (null != channel) {
//            channel.disconnect();
//            channel = null;
//        }
//        if (null != session) {
//            session.disconnect();
//            session = null;
//        }
//    }
//
//    /**
//     * 上传文件
//     * //     * @param directory 上传的目录-相对于SFPT设置的用户访问目录，
//     * 为空则在SFTP设置的根目录进行创建文件（除设置了服务器全磁盘访问）
//     *
//     * @param
//     */
//    public static void upload(MultipartFile file) throws Exception {
//        System.out.println("springmvc文件上传...");
//        SFTP s = new SFTP();
//        getConnect(s);//建立连接
//        Session session = s.getSession();
//        Channel channel = s.getChannel();
//        ChannelSftp sftp = s.getSftp();// sftp操作类
//        InputStream is ;
//        is = file.getInputStream();
//
//        try {
//            String path = "/data/docker/nginx/html/" + file.getOriginalFilename();
//            sftp.put(is, path, ChannelSftp.OVERWRITE);
//            is.close();
//
//        } catch (SftpException sException) {
//            throw new RRException("上传文件异常");
//
//        } finally {
//            disConn(session, channel, sftp);
//        }
//    }
//
//    /**
//     * 下载文件
//     * @param downloadFile  下载的文件
//     */
//    public static R downloadStream(String downloadFile, HttpServletResponse response)  {
//        String path = "/data/docker/nginx/html/"+downloadFile ;
//        SFTP s=new SFTP();
//        getConnect(s);//建立连接
//        Session session = s.getSession();
//        Channel channel = s.getChannel();
//        ChannelSftp sftp = s.getSftp();// sftp操作类
//        Map<String, Object> map = new HashMap<>();
//
//        // 配置文件下载
//        response.setHeader("content-type", "application/octet-stream");
//        response.setContentType("application/octet-stream");
//        // 下载文件能正常显示中文
//        try {
//            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(path, "UTF-8"));
//        } catch (UnsupportedEncodingException e) {
//            throw new RRException("下载文件异常"+e.getMessage());
//        }
//        // 实现文件下载
//        byte[] buffer = new byte[1024];
//        FileInputStream fis = null;
//        BufferedInputStream bis = null;
//        try {
//            bis = new BufferedInputStream(sftp.get(path));
//            OutputStream os = response.getOutputStream();
//            int n;
//            while ((n = bis.read(buffer, 0, 1024)) != -1) {
//                os.write(buffer, 0, n);
//                os.flush();
//            }
//            map.put("result", "true");
//
//        } catch (Exception e) {
////            System.out.println("Download  failed!"+e.getMessage());
//            throw new RRException("下载文件异常"+e.getMessage());
//        } finally {
//            if (bis != null) {
//                try {
//                    bis.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//            if (fis != null) {
//                try {
//                    fis.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//            disConn(session,channel,sftp);
//        }
//        return R.ok(map);
//
//    }
//
//
//
//
//    /**
//     * 删除文件
//     *
//     *  directory  要删除文件所在目录
//     * @param deleteFile 要删除的文件
//     *                   String directory,
//     */
//    public static void delete(String directory, String deleteFile) throws Exception {
//        SFTP s = new SFTP();
//        getConnect(s);//建立连接
//        Session session = s.getSession();
//        Channel channel = s.getChannel();
//        ChannelSftp sftp = s.getSftp();// sftp操作类
//        try {
//            sftp.cd(directory); //进入的目录应该是要删除的目录的上一级
//            sftp.rm(deleteFile);//删除文件
//        } catch (Exception e) {
//            throw new Exception(e.getMessage(), e);
//        } finally {
//            disConn(session, channel, sftp);
//        }
//    }
//
//    /**
//     * 列出目录下的文件
//     *
//     * @param directory 要列出的目录
//     * @return list 文件名列表
//     * @throws Exception
//     */
//    static Map<String, NodeBean> nodesMy = new HashMap<String, NodeBean>();
//    public static JSONArray listFiles(String directory) throws Exception {
//        nodesMy.clear();
//
//        SFTP s = new SFTP();
//        getConnect(s);//建立连接
//        ChannelSftp sftp = s.getSftp();// sftp操作类
//        List<ChannelSftp.LsEntry> fileList  = sftp.ls(directory); //返回目录下所有文件名称 ;
////        List<String> fileNameList = new ArrayList<String>();
//        for (int i=0 ;i<fileList.size();i++) {
//            String fileName = ( fileList.get(i)).getFilename();
//            if (".".equals(fileName) || "..".equals(fileName)) {
//                continue;
//            }
//            cutName(fileName,i);
//        }
////        String s1 = JSON.toJSONString(getNodeJson("0", nodesMy));
//        JSONArray nodeJson = getNodeJson("0", nodesMy);
//        return nodeJson;
//    }
//
//
//
//
//    private static void cutName(String fileName,int keyName) {
//
//        String resultString ;
//        try {
//            Pattern regex = Pattern.compile("([^\\\\/:*?\"<>|\r\n]+$)");
//            Matcher regexMatcher = regex.matcher(fileName);
//            if (regexMatcher.find()) {
//                resultString = regexMatcher.group(1);
//                System.out.println(resultString);
//                //将名称切割
//                String result[] = resultString.split("-");
//                String id = result[0];
//                String pId = result[1];
//                String name = result[2];
//                System.out.println("自身ID"+id );
//                System.out.println("父ID"+pId);
//                System.out.println("名字"+name);
//                //是文件
//                if(name.contains(".")){
//                    nodesMy.put(String.valueOf(keyName), new NodeBean(id, name, pId,"f"));
//                }else {
//                    //是目录
//                    nodesMy.put(String.valueOf(keyName), new NodeBean(id, name, pId,"d"));
//                }
////               System.out.println("result:" + JSON.toJSONString(getNodeJson("0", nodesMy)));
//            }
//        } catch (PatternSyntaxException ex) {
//            System.out.println(ex.getMessage());
//        }
//
//    }
//
//    /**
//     * 递归处理   数据库树结构数据->树形json
//     *
//     * @param nodeId
//     * @param nodes
//     * @return
//     */
//    public static JSONArray getNodeJson(String nodeId, Map<String, NodeBean> nodes) {
//        //当前层级当前node对象
////        NodeBean cur = nodes.get(nodeId);
//        //当前层级当前点下的所有子节点（实战中不要慢慢去查,一次加载到集合然后慢慢处理）
//        List<NodeBean> childList = getChildNodes(nodeId, nodes);
//        JSONArray childTree = new JSONArray();
//        //具体的某个节点
//        for (NodeBean node : childList) {
//            JSONObject o = new JSONObject();
//            o.put("name", node.getName());
//            o.put("pId", node.getPId());
//            o.put("id", node.getId());
//            o.put("type",node.getType());
//
//            JSONArray childs = getNodeJson(node.getId(), nodes);  //递归调用该方法
//            if (!childs.isEmpty()) {
//                o.put("childrens", childs);
//            }
//            childTree.fluentAdd(o);
//        }
//        return childTree;
//    }
//
//    /**
//     * 获取当前节点的所有子节点
//     *
//     * @param nodeId
//     * @param nodes
//     * @return
//     */
//    public static List<NodeBean> getChildNodes(String nodeId, Map<String, NodeBean> nodes) {
//        List<NodeBean> list = new ArrayList<NodeBean>();
//        //循环遍历整个数据，找到要查询的某个节点id，node的父亲节点。相等。加入如list，就是这个nodeId的所有子节点
//        for (String key : nodes.keySet()) {
//            System.out.println("map 的 key= "+key);
//            //节点的父节点等于当前节点
//            if (nodes.get(key).getPId().equals(nodeId)) {
//                list.add(nodes.get(key));
//            }
//        }
//        System.out.println("当前节点下的所有节点"+list.size());
//        return list;
//    }
//
//
//    /**
//     * 删除目录下所有文件
//     *
//     * @param directory 要删除文件所在目录
//     */
////    public static void deleteAllFile(String directory) throws Exception {
////        SFTP s = new SFTP();
////        getConnect(s);//建立连接
////        Session session = s.getSession();
////        Channel channel = s.getChannel();
////        ChannelSftp sftp = s.getSftp();// sftp操作类
////        try {
////            List<String> files = listFiles(directory);//返回目录下所有文件名称
////            sftp.cd(directory); //进入目录
////
////            for (String deleteFile : files) {
////                sftp.rm(deleteFile);//循环一次删除目录下的文件
////            }
////        } catch (Exception e) {
////            throw new Exception(e.getMessage(), e);
////        } finally {
////            disConn(session, channel, sftp);
////        }
////
////    }
//
//    /**
//     * 删除目录 (删除的目录必须为空)
//     *
//     * @param deleteDir 要删除的目录
//     */
//    public static void deleteDir(String deleteDir) throws Exception {
//        SFTP s = new SFTP();
//        getConnect(s);//建立连接
//        Session session = s.getSession();
//        Channel channel = s.getChannel();
//        ChannelSftp sftp = s.getSftp();// sftp操作类
//        try {
//            sftp.rmdir(deleteDir);
//        } catch (Exception e) {
//            throw new Exception(e.getMessage(), e);
//        } finally {
//            disConn(session, channel, sftp);
//        }
//    }
//
//    /**
//     * 创建目录
//     *
//     * @param directory 要创建的目录 位置
//     * @param dir       要创建的目录
//     */
//    public static void creatDir(String directory, String dir)  {
//        SFTP s = new SFTP();
//        getConnect(s);//建立连接
//        Session session = s.getSession();
//        Channel channel = s.getChannel();
//        ChannelSftp sftp = s.getSftp();// sftp操作类
//        try {
//            sftp.cd(directory);
//            sftp.mkdir(dir);
//        } catch (Exception e) {
//            throw new RRException("创建目录异常");
////            throw new Exception(e.getMessage(), e);
//        } finally {
//            disConn(session, channel, sftp);
//        }
//    }
//
//    /**
//     * 更改文件名
//     * @param directory 文件所在目录
//     * @param oldFileNm 原文件名
//     * @param newFileNm 新文件名
//     * @throws Exception
//     */
//    public static void rename(String directory, String oldFileNm, String newFileNm) throws Exception {
//        SFTP s = new SFTP();
//        getConnect(s);//建立连接
//        Session session = s.getSession();
//        Channel channel = s.getChannel();
//        ChannelSftp sftp = s.getSftp();// sftp操作类
//        try {
//            sftp.cd(directory);
//            sftp.rename(oldFileNm, newFileNm);
//        } catch (Exception e) {
//            throw new Exception(e.getMessage(), e);
//        } finally {
//            disConn(session, channel, sftp);
//        }
//    }
//
//
//}
//
//
